home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48hor2 / csim.src < prev    next >
Text File  |  1991-11-23  |  14KB  |  752 lines

  1. %%HP:T(3)A(R)F(.);
  2. DIR
  3. @ --------------------------------------------------------
  4. @ Title   : CSIM (a simple circuit simulator for the HP48)
  5. @ Version : 2.5
  6. @ Author  : Per Stenius
  7. @ LastEdit: 22.10.91
  8. @ Copyright Per Stenius (1991)
  9. @ --------------------------------------------------------
  10.  
  11. CST
  12. {Csim View node ymin ymax CLRSC
  13. outp CIR\-> CIR \->CIR Setup dc
  14. w ac t tstep tran Euler X
  15. G C Cc W Wlist iterdc}
  16.  
  17. Csim
  18. \<<
  19.   "  Csim_HP-48 2.5
  20.  
  21.  
  22.  (c) Per Stenius 1991" CLLCD 2 DISP
  23.   1 WAIT CLLCD
  24.   "Setup?" "Y" INPUT
  25.   IF
  26.   "Y" SAME
  27.   THEN
  28.     "Wait..." CLLCD 1 DISP
  29.     IF
  30.     DEPTH 0 ==
  31.     THEN
  32.       CIR LIST\-> DROP
  33.     END
  34.     Setup
  35.   END
  36.   "Analysis? (D, A, T)" "" INPUT
  37.   \-> analysis
  38.   \<<
  39.     CASE
  40.  
  41.       analysis "D" SAME
  42.       THEN
  43.         dc
  44.       END
  45.  
  46.       analysis "A" SAME
  47.       THEN
  48.         "Sweep range?" {":wstart:
  49. :wstop:" { 1 0 } V } INPUT
  50.         OBJ\-> \-> wstart wstop
  51.         \<<
  52.           wstop wstart - 130 /
  53.           'wstep' STO
  54.           wstart 'w' STO
  55.           'acplot' STEQ
  56.           wstart wstop XRNG
  57.           ymin ymax YRNG
  58.           'w' INDEP
  59.           DRAX                @ Add ERASE to clear PICT
  60.           {(0,0) "jw" "f(jw)"} AXES LABEL
  61.           DRAW GRAPH
  62.         \>>
  63.       END
  64.  
  65.       analysis "T" SAME
  66.       THEN
  67.         "Sweep range?" {":tstart:0
  68. :tstep:0
  69. :tstop:1" { 3 0 } V } INPUT
  70.         OBJ\->
  71.         \-> tstart ttstep tstop
  72.         \<<
  73.           IF
  74.           ttstep 0 ==
  75.           THEN
  76.             tstop tstart - 130 /
  77.             'tstep' STO
  78.           ELSE
  79.             ttstep 'tstep' STO
  80.           END
  81.           tstart tstep 130 * XRNG
  82.           ymin ymax YRNG
  83.           't' INDEP
  84.           DRAX                @ Add ERASE to clear PICT
  85.           {(0,0) "t" "f(t)"} AXES LABEL
  86.           IF
  87.           Euler NOT
  88.           THEN
  89.             tstep 2 / 'tstep' STO
  90.             'tranTR' STEQ
  91.           ELSE
  92.             'tranBE' STEQ
  93.           END
  94.           G tstep * C + INV
  95.           'iChG' STO
  96.           DRAW GRAPH
  97.         \>>
  98.       END
  99.     END
  100.   \>>
  101. \>>
  102.  
  103. outp                          @ Enables user defined calculations
  104. \<< node GET
  105. \>>
  106.  
  107. dc
  108. \<<                           @ DC analysis
  109.  Wlist\->W W G / DUP 'X' STO  @ The result vector is returned
  110. \>>                           @ to the stack
  111.  
  112. iterdc                        @ Iterative DC analysis, max 100
  113. \<< 0 \-> i                   @ iterations
  114.   \<<
  115.     DO
  116.       X dc
  117.     UNTIL
  118.     ==
  119.     'i' INCR 100 > OR
  120.     END
  121.     IF
  122.     i 100 >
  123.     THEN
  124.       "100 ITERATIONS
  125. CHECK CONVERGENCE" 1 DISP 1 FREEZE
  126.     ELSE
  127.       dc
  128.     END
  129.   \>>
  130. \>>
  131.  
  132. ac
  133. \<<
  134.   Wlist\->W W G C w * R\->C   @ AC analysis
  135.   Cc + / DUP 'X' STO          @ The result vector is returned to
  136. \>>                           @ the stack
  137.  
  138. tran
  139. \<<                           @ Trapezoidal approx.
  140.  iChG
  141.  W Wlist\->W W + tstep 2 / *
  142.  C G tstep 2 / * - X * + *
  143.  DUP 'X' STO
  144.  t tstep + 't' STO
  145. \>>
  146.  
  147. acplot
  148. \<<
  149.   ac outp                     @ outp is always called last
  150.   wstep w + 'w' STO           @ in a plotting program
  151. \>>
  152.  
  153. tranBE
  154. \<<
  155.  iChG                         @ Inverse Euler approx.
  156.  Wlist\->W W tstep *          @ Returns the next result to stack
  157.  C X * + *                    @ Used as default when plotting
  158.  DUP 'X' STO outp             @ outp is always called last
  159. \>>
  160.  
  161. tranTR
  162. \<<                           @ Trapezoidal approx.
  163.  iChG
  164.  W Wlist\->W W + tstep *
  165.  C G tstep * - X * + *
  166.  DUP 'X' STO outp             @ outp is always called last
  167. \>>
  168.  
  169. Wlist\->W                     @ Functional values -> numerical
  170. \<<
  171.  Wlist LIST\-> 1 SWAP
  172.  START
  173.     \->NUM
  174.     dim ROLL
  175.  NEXT
  176.  dim 1 getpos \->ARRY
  177.  'W' STO
  178. \>>
  179.  
  180. Setup
  181. \<<
  182.   -3 CF                       @ Enable symbolic mode
  183.   -17 SF -18 CF               @ and radian mode
  184.   0 't' STO
  185.   0 'ndim' STO
  186.   0 'bdim' STO
  187.   DEPTH 1 SWAP
  188.   START
  189.      1 GETI
  190.      \-> cmptype
  191.      \<<
  192.        IF
  193.        cmptype 'm' SAME NOT  @ Not a component!
  194.        THEN
  195.          cmptype
  196.          incbdim GETI
  197.          incndim GETI
  198.          incndim
  199.          IF
  200.          cmptype 'O' SAME    @ Components with 4 nodes
  201.          cmptype 'M' SAME OR @ New two-ports: add type here!
  202.          cmptype 'T' SAME OR
  203.          cmptype 'g' SAME OR
  204.          cmptype 'r' SAME OR
  205.          cmptype 'a' SAME OR
  206.          cmptype 'r' SAME OR
  207.          cmptype 'a' SAME OR
  208.          cmptype 'u' SAME OR
  209.          cmptype 'y' SAME OR
  210.          cmptype 'z' SAME OR
  211.          THEN
  212.            GETI incndim
  213.            GETI incndim
  214.          END
  215.        END
  216.        DROP DEPTH ROLL
  217.      \>>
  218.   NEXT
  219.   ndim bdim + 'dim' STO
  220.   [[ 0 ]] dim DUP getpos RDM DUP
  221.   'G' STO 'C' STO
  222.   [[ (0,0) ]] dim DUP getpos RDM
  223.   'Cc' STO
  224.   [[ 0 ]] dim 1 getpos RDM
  225.   DUP 'X' STO 'W' STO
  226.   1 dim
  227.   START
  228.      0
  229.   NEXT
  230.   dim \->LIST 'Wlist' STO
  231.   DEPTH 1 SWAP
  232.   START
  233.      IFERR
  234.         DUP 1 GET
  235.         loadmatrix
  236.         DEPTH ROLL
  237.      THEN
  238.         "SYNTAX ERROR" DOERR
  239.      END
  240.   NEXT
  241.   DEPTH \->LIST 'CIR' STO
  242. \>>
  243.  
  244. loadmatrix
  245. \<< \-> cmptype
  246.   \<<
  247.     DUP 2 GET
  248.     2 PICK 3 GET              @ cmp n1 n2
  249.     CASE
  250.        cmptype 'G' SAME       @ Conductor and capacitor
  251.        cmptype 'C' SAME OR
  252.        THEN
  253.           getval
  254.           cmptype putGC
  255.        END
  256.  
  257.        cmptype 'R' SAME 
  258.        cmptype 'L' SAME OR    @ Resistor and inductor
  259.        THEN
  260.           getval
  261.           getbranch
  262.           IF
  263.           cmptype 'R' SAME
  264.           THEN
  265.             'G'
  266.             putRL
  267.           ELSE
  268.             putL
  269.           END
  270.        END
  271.  
  272.        cmptype 'Z' SAME       @ Constant valued impedance
  273.        THEN
  274.           getval INV
  275.           putY
  276.        END
  277.  
  278.        cmptype 'Y' SAME       @ Constant valued admittance
  279.        THEN
  280.           getval
  281.           putY
  282.        END
  283.  
  284.        cmptype 'J' SAME       @ Ideal current source
  285.        THEN
  286.           getval
  287.           putJ
  288.        END
  289.  
  290.        cmptype 'S' SAME       @ Short-circuit
  291.        THEN
  292.           getval              @ n1 n2 branch          
  293.           putS
  294.        END
  295.  
  296.        cmptype 'E' SAME       @ Ideal voltage source
  297.        THEN
  298.           getval
  299.           getbranch
  300.           putE
  301.        END
  302.  
  303.        cmptype 'O' SAME       @ Ideal opamp
  304.        THEN
  305.           getn34
  306.           5 PICK 6 GET        @ n1 n2 n3 n4 branch
  307.           putO
  308.        END
  309.  
  310.        cmptype 'M' SAME       @ Transformer
  311.        THEN
  312.           getn34vb
  313.           7 PICK 8 GET
  314.           8 PICK 9 GET
  315.           9 PICK 10 GET       @ n1 n2 n3 n4 l1 l2 m b1 b2
  316.           putM
  317.        END
  318.  
  319.        cmptype 'T' SAME       @ Lossless transmission line
  320.        THEN
  321.           getn34vb            @ n1 n2 n3 n4 ll Zo
  322.           putT
  323.        END
  324.  
  325.        cmptype 'm' SAME       @ Mutual inductance
  326.        THEN
  327.           getval
  328.           putm                @ b1 b2 val
  329.        END
  330.  
  331.        cmptype 'g' SAME       @ VCCS
  332.        THEN
  333.           getn34
  334.           5 PICK 6 GET        @ n1 n2 n3 n4 val
  335.           putg
  336.        END
  337.  
  338.        cmptype 'r' SAME       @ CCVS
  339.        THEN
  340.           getn34vb
  341.           7 PICK 8 GET        @ n1 n2 n3 n4 val b1 b2
  342.           putr
  343.        END
  344.  
  345.        cmptype 'p' SAME       @ CCVS version 2
  346.        THEN
  347.           getvb1b2
  348.           putp                @ n3 n4 val b1 b2
  349.        END
  350.  
  351.        cmptype 'a' SAME       @ CCCS
  352.        THEN
  353.           getn34vb            @ n1 n2 n3 n4 val branch
  354.           puta
  355.        END
  356.  
  357.        cmptype 'b' SAME       @ CCVS version 2
  358.        THEN
  359.           getn34
  360.           putb                @ n3 n4 val b
  361.        END
  362.  
  363.        cmptype 'u' SAME       @ VCVS
  364.        THEN
  365.           getn34vb            @ n1 n2 n3 n4 val branch
  366.           putu
  367.        END
  368.  
  369.        cmptype 'z' SAME       @ z-parameters (two-port)
  370.        THEN
  371.           getn34v1234         @ n1 n2 n3 n4 y11 y12 y21 y22
  372.           {2 2} \->ARRY INV
  373.           ARRY\-> DROP
  374.           puty
  375.        END
  376.  
  377.        cmptype 'y' SAME       @ y-parameters (two-port)
  378.        THEN
  379.           getn34v1234         @ n1 n2 n3 n4 y11 y12 y21 y22
  380.           puty
  381.        END
  382.                               @ Add new components here!
  383.     END
  384.   \>>
  385. \>>
  386.  
  387. putGC                         @ Routines to load component stamp
  388. \<< \-> n1 n2 value type      @ into matrix (or vector)
  389.   \<<                         @ Add new stamps here!
  390.     value n2 n1 checknodes
  391.     type RCL
  392.     n1 n2 value puty2
  393.     type STO
  394.   \>>
  395. \>>
  396.  
  397. putRL
  398. \<< \-> n1 n2 value branch matr
  399.   \<<
  400.     branch n2 n1 checknodes   @ Enables short-circuits
  401.     n1 n2 branch putL2
  402.     matr RCL
  403.     branch DUP value NEG putmatrix
  404.     matr STO
  405.   \>>
  406. \>>
  407.  
  408. putJ
  409. \<< \-> n1 n2 value
  410.   \<< 
  411.     value n2 n1 checknodes
  412.     Wlist DUP
  413.     IF n1 0 >
  414.     THEN
  415.        n1 GET value - n1 SWAP
  416.        PUT DUP
  417.     END
  418.     IF n2 0 >
  419.     THEN
  420.        n2 GET value + n2 SWAP PUT
  421.     ELSE
  422.        DROP
  423.     END
  424.     'Wlist' STO
  425.   \>>
  426. \>>
  427.  
  428. putE
  429. \<< \-> n1 n2 value branch
  430.   \<<
  431.     value n2 n1 checknodes
  432.     n1 n2 0 branch putL
  433.     Wlist DUP
  434.     branch GET value +
  435.     branch SWAP PUT
  436.     'Wlist' STO
  437.   \>>
  438. \>>
  439.  
  440. putM
  441. \<< \-> n1 n2 n3 n4 l1 l2 m b1 b2
  442.   \<<
  443.     n1 n2 l1 b1 putL
  444.     n3 n4 l2 b2 putL
  445.     b1 b2 m putm
  446.   \>>
  447. \>>
  448.  
  449. putm
  450. \<< \-> b1 b2 m
  451.   \<<
  452.     m b1 b2 checknodes
  453.     C
  454.     b1 b2 m NEG putmatrix
  455.     b2 b1 m NEG putmatrix
  456.     'C' STO
  457.   \>>
  458. \>>
  459.  
  460. putS
  461. \<< \-> n1 n2 b
  462.   \<<
  463.     n1 n2 0 b putL
  464.   \>>
  465. \>>
  466.  
  467. putT
  468. \<< \-> n1 n2 n3 n4 ll Zo
  469.   \<<
  470.     ll 2 \135 * * \->NUM \-> gamma
  471.     \<<
  472.       ll n1 n3 checknodes
  473.       IF
  474.       n2 n4 \139
  475.       THEN
  476.         "n2 MUST EQUAL n4 IN T" DOERR
  477.       ELSE
  478.         'INV(i*Zo*SIN(gamma))' \->NUM
  479.         Cc
  480.         n1 n3 4 PICK puty2
  481.         SWAP
  482.         'COS(gamma)-1' \->NUM *
  483.         SWAP
  484.         n1 n2 4 PICK puty2
  485.         n3 n4 4 ROLL puty2
  486.         'Cc' STO
  487.       END
  488.     \>>
  489.   \>>
  490. \>>
  491.  
  492. putg
  493. \<< \-> n1 n2 n3 n4 value
  494.   \<<
  495.     value n2 n1 checknodes
  496.     value n3 n4 checknodes
  497.     G
  498.     n1 n2 n3 n4 value putg2
  499.     'G' STO
  500.   \>>
  501. \>>
  502.  
  503. putr
  504. \<< \-> n1 n2 n3 n4 val b1 b2
  505.   \<<
  506.     b1 n2 n1 checknodes
  507.     n1 n2 b1 putS             @ Short circuit
  508.     n3 n4 val b1 b2 putp
  509.   \>>
  510. \>>
  511.  
  512. putp
  513. \<< \-> n3 n4 val b1 b2
  514.   \<<
  515.     val n3 n4 checknodes
  516.     G
  517.     b2 n3 1 putmatrix
  518.     b2 n4 -1 putmatrix
  519.     b2 b1 val NEG putmatrix
  520.     n3 b2 1 putmatrix
  521.     n4 b2 -1 putmatrix
  522.     'G' STO
  523.   \>>
  524. \>>
  525.  
  526. putu
  527. \<< \-> n1 n2 n3 n4 value branch
  528.   \<<
  529.     value n2 n1 checknodes
  530.     branch n3 n4 checknodes
  531.     G
  532.     branch n1 value NEG putmatrix
  533.     branch n2 value putmatrix
  534.     branch n3 1 putmatrix
  535.     branch n4 -1 putmatrix
  536.     n3 branch 1 putmatrix
  537.     n4 branch -1 putmatrix
  538.     'G' STO    
  539.   \>>
  540. \>>
  541.  
  542. puta
  543. \<< \-> n1 n2 n3 n4 val branch
  544.   \<<
  545.     val n2 n1 checknodes
  546.     n1 n2 branch putS         @ Short circuit
  547.     n3 n4 val branch putb
  548.   \>>
  549. \>>
  550.  
  551. putb
  552. \<< \-> n3 n4 val branch
  553.   \<<
  554.     val n3 n4 checknodes
  555.     G
  556.     n3 branch val putmatrix
  557.     n4 branch val NEG putmatrix    
  558.     'G' STO    
  559.   \>>
  560. \>>
  561.  
  562. putO
  563. \<< \-> n1 n2 n3 n4 branch
  564.   \<<
  565.     1 n2 n1 checknodes
  566.     1 n3 n4 checknodes
  567.     G
  568.     branch n1 1 putmatrix
  569.     branch n2 -1 putmatrix
  570.     n3 branch 1 putmatrix
  571.     n4 branch -1 putmatrix
  572.     'G' STO
  573.   \>>
  574. \>>
  575.  
  576. putY
  577. \<< \-> n1 n2 value
  578.   \<<
  579.     value n2 n1 checknodes
  580.     Cc
  581.     n1 n2 value puty2
  582.     'Cc' STO
  583.   \>>
  584. \>>
  585.  
  586. puty
  587. \<< \-> n1 n2 n3 n4 y11 y12 y21 y22
  588.   \<<
  589.     y11 n2 n1 checknodes
  590.     y22 n2 n1 checknodes
  591.     Cc
  592.     n1 n2 y11 puty2
  593.     n3 n4 y22 puty2
  594.     n1 n2 n3 n4 y21 putg2
  595.     n3 n4 n1 n2 y12 putg2
  596.     'Cc' STO
  597.   \>>
  598. \>>
  599.  
  600. putL
  601. \<<
  602.  'C' putRL
  603. \>>
  604.  
  605. putL2
  606. \<< \-> n1 n2 branch
  607.   \<<
  608.     G
  609.     n1 branch 1 putmatrix
  610.     n2 branch -1 putmatrix
  611.     branch n1 1 putmatrix
  612.     branch n2 -1 putmatrix
  613.     'G' STO
  614.   \>>
  615. \>>
  616.  
  617. putg2
  618. \<< \-> n1 n2 n3 n4 value
  619.   \<<
  620.     n3 n1 value putmatrix
  621.     n4 n2 value putmatrix
  622.     n3 n2 value NEG putmatrix
  623.     n4 n1 value NEG putmatrix
  624.   \>>
  625. \>>
  626.  
  627. puty2
  628. \<< \-> n1 n2 value
  629.   \<<
  630.     n1 n1 value putmatrix
  631.     n2 n2 value putmatrix
  632.     n1 n2 value NEG putmatrix
  633.     n2 n1 value NEG putmatrix
  634.   \>>
  635. \>>
  636.  
  637. putmatrix
  638. \<< \-> matrix row col value
  639.   \<<
  640.     IF
  641.     row 0 \139
  642.     col 0 \139 AND
  643.     THEN
  644.        matrix DUP
  645.        row col getpos GET value +
  646.        row col getpos SWAP PUT
  647.     ELSE
  648.        matrix
  649.     END
  650.   \>>
  651. \>>
  652.  
  653. incbdim                       @ Increase matrix dimension
  654. \<< \-> cmptype               @ (branch)
  655.   \<<
  656.     IF
  657.     cmptype 'E' SAME
  658.     cmptype 'R' SAME OR
  659.     cmptype 'L' SAME OR
  660.     cmptype 'S' SAME OR
  661.     cmptype 'O' SAME OR
  662.     cmptype 'u' SAME OR
  663.     cmptype 'a' SAME OR
  664.     cmptype 'p' SAME OR
  665.     THEN
  666.        bdim 1 + 'bdim' STO
  667.     ELSE
  668.        IF
  669.        cmptype 'M' SAME
  670.        cmptype 'r' SAME OR
  671.        THEN
  672.           bdim 2 + 'bdim' STO
  673.        END
  674.     END
  675.   \>>
  676. \>>
  677.  
  678. incndim                       @ Increase matrix dimension (node)
  679. \<< \-> x
  680.   \<<
  681.     IF
  682.     x ndim >
  683.     THEN
  684.        x 'ndim' STO
  685.     END
  686.   \>>
  687. \>>
  688.  
  689. checknodes
  690. \<< \-> value n2 n1
  691.   \<<
  692.     CASE
  693.        n1 0 <
  694.        n2 0 < OR
  695.        THEN
  696.           "NEGATIVE NODE NO." DOERR
  697.        END
  698.  
  699.        n1 0 ==
  700.        n2 0 == AND
  701.        THEN
  702.           "BOTH NODES GND" DOERR
  703.        END
  704.  
  705.        n1 n2 ==
  706.        THEN
  707.           "BOTH NODES SAME" DOERR
  708.        END
  709.  
  710.        value 0 SAME
  711.        THEN
  712.           "ZERO VALUE OR BRANCH" DOERR
  713.        END
  714.     END
  715.   \>>
  716. \>>
  717.  
  718. getn34
  719. \<<
  720.  3 PICK 4 GET
  721.  4 PICK 5 GET
  722. \>>
  723.  
  724. getval
  725. \<<
  726.  3 PICK 4 GET
  727. \>>
  728.  
  729. getvb1b2
  730. \<<
  731.  getn34
  732.  5 PICK 6 GET
  733. \>>
  734.  
  735. getn34vb
  736. \<<
  737.  getvb1b2
  738.  6 PICK 7 GET
  739. \>>
  740.  
  741. getn34v1234
  742. \<<
  743.  getn34vb
  744.  7 PICK 8 GET
  745.  8 PICK 9 GET
  746. \>>
  747.  
  748. getbranch
  749. \<<
  750.  4 PICK 5 GET
  751. \>>
  752.